package com.at.c05_stack.invoke;

/**
 * 解析调用中非虚方法、虚方法的测试
 *
 * @author huangchao E-mail:fengquan8866@163.com
 * @version 创建时间：2024/7/3 16:28
 */
class Father {
    public Father() {
        System.out.println("father的构造器");
    }

    public static void showStatic(String str) {
        System.out.println("father " + str);
    }

    public final void showFinal() {
        System.out.println("father show final");
    }

    public void showCommon() {
        System.out.println("father 普通方法");
    }
}

public class Son extends Father {
    public Son() {
        super(); // invokespecial
    }

    public Son(int age) {
        this(); // invokespecial
    }

    // 不是重写的父类方法
    public static void showStatic(String str) {
        System.out.println("son " + str);
    }

    private void showPrivate(String str) {
        System.out.println("son private" + str);
    }

    public void show() {
        showStatic("hc.com"); // invokestatic
        super.showStatic("good!"); // invokestatic
        showPrivate("hello!"); // invokespecial
        super.showCommon(); // invokespecial
        showFinal(); // invokevirtual + final: 不能被子类重写，所以也是非虚方法
        showCommon(); // invokevirtual
        info(); // invokevirtual

        MethodInterface in = null;
        in.methodA();
    }

    public void info() {

    }

    public void display(Father f) {
        f.showCommon();
    }

    public static void main(String[] args) {
        Son son = new Son();
        son.show();
    }
}

interface MethodInterface {
    void methodA();
}